package main

import (
	"fmt"
	"math"
)

func main() {
	integers := powerfulIntegers(1, 2, 100)
	fmt.Println(integers)
}

/*
给定两个正整数 x 和 y，如果某一整数等于 x^i + y^j，其中整数 i >= 0 且 j >= 0，那么我们认为该整数是一个强整数。
返回值小于或等于 bound 的所有强整数组成的列表。
你可以按任何顺序返回答案。在你的回答中，每个值最多出现一次。
示例 1：
输入：x = 2, y = 3, bound = 10
输出：[2,3,4,5,7,9,10]
解释：
2 = 2^0 + 3^0
3 = 2^1 + 3^0
4 = 2^0 + 3^1
5 = 2^1 + 3^1
7 = 2^2 + 3^1
9 = 2^3 + 3^0
10 = 2^0 + 3^2
*/

func powerfulIntegers(x int, y int, bound int) []int {

	list := []int{}
	numMap := make(map[float64]bool)
	if bound == 0{
		return list
	}
	if x == 1 && y == 1{
		return []int{2}
	}
	if x == 1 && y >1{
		for i:=0;math.Pow(float64(y),float64(i))<float64(bound);i++{
			res := math.Pow(float64(y),float64(i)) +1
			if res <= float64(bound){
				_,ok := numMap[res]
				if !ok {
					numMap[res]=true
					list = append(list, int(res))
				}
			}
		}
		return list
	}

	if x> 1 && y == 1{
		for i:=0;math.Pow(float64(x),float64(i))<float64(bound);i++{
			res := math.Pow(float64(x),float64(i)) +1
			if res <= float64(bound){
				_,ok := numMap[res]
				if !ok {
					numMap[res]=true
					list = append(list, int(res))
				}
			}
		}
		return list
	}else{
		for i:=0;math.Pow(float64(y),float64(i))<float64(bound);i++{
			for j:=0;math.Pow(float64(x),float64(j))<float64(bound);j++{
				res := math.Pow(float64(x),float64(j)) + math.Pow(float64(y),float64(i))
				if res <= float64(bound){
					_,ok := numMap[res]
					if !ok {
						numMap[res]=true
						list = append(list, int(res))
					}
				}
			}
		}
		return list
	}

	return list
}
